Java Technologies Fail-fast এবং Fail-safe Iterators এর ধারণা গাইড ও নোট

328

Java.util Package এর Iterators এর মাধ্যমে আপনি একটি Collection বা Map এর উপাদানগুলোকে একটি নির্দিষ্ট অর্ডারে বা ধারাবাহিকভাবে ট্রাভার্স (iterate) করতে পারেন। যখন আপনি একটি Collection বা Map এর উপাদান ট্রাভার্স করছেন, তখন এটি গুরুত্বপূর্ণ যে আপনি কোন ধরনের Iterator ব্যবহার করছেন, কারণ কিছু Iterator তে fail-fast এবং কিছুতে fail-safe আচরণ থাকে।

এখানে আমরা আলোচনা করব Fail-fast এবং Fail-safe Iterators এর মধ্যে পার্থক্য এবং তাদের ব্যবহারের ধারণা।


1. Fail-fast Iterator

Fail-fast Iterator এমন একটি Iterator যেটি একটি Collection বা Map এর উপাদান ট্রাভার্স করার সময় যদি সেই Collection অথবা Map পরিবর্তিত হয় (যেমন, উপাদান মুছে ফেলা বা যোগ করা), তাহলে এটি ConcurrentModificationException ছুড়ে দেয়। এর মানে হলো, এটি যখনই শনাক্ত করবে যে সংশ্লিষ্ট সংগ্রহটি পরিবর্তিত হয়েছে, তখনই এটি ত্রুটি (exception) ঘটাবে এবং ব্যবহৃত থ্রেড থামিয়ে দেবে।

Key Characteristics of Fail-fast Iterators:

  • এটি ConcurrentModificationException ছুড়ে দেয় যদি Collection বা Map এর উপাদান iterate করার সময় পরিবর্তিত হয়।
  • Fail-fast Iterators সাধারণত ArrayList, HashMap এর মতো java.util এর বেশিরভাগ ক্লাসে ব্যবহৃত হয়।
  • এটি thread-safe নয়, অর্থাৎ একাধিক থ্রেড যদি একই সময় Collection বা Map পরিবর্তন এবং ট্রাভার্স করে, তবে ConcurrentModificationException ঘটাতে পারে।

Example of Fail-fast Iterator:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class FailFastIteratorExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Orange");

        // Creating an iterator
        Iterator<String> iterator = list.iterator();
        
        // Removing an element while iterating
        while (iterator.hasNext()) {
            String item = iterator.next();
            if (item.equals("Banana")) {
                list.remove(item); // This will cause ConcurrentModificationException
            }
        }
    }
}

Output:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013)
    at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967)
    at FailFastIteratorExample.main(FailFastIteratorExample.java:15)

Explanation:

  • এখানে, আমরা একটি ArrayList তৈরি করেছি এবং তার মাধ্যমে iterator দিয়ে উপাদান ট্রাভার্স করেছি। যখন আমরা Banana উপাদান মুছে ফেলেছি, তখন ConcurrentModificationException ঘটেছে কারণ আমরা ট্রাভার্স করার সময় Collection এর উপাদান পরিবর্তন করেছি।

2. Fail-safe Iterator

Fail-safe Iterator এমন একটি Iterator যা Collection বা Map পরিবর্তিত হলেও কোন ধরনের exception ছুড়ে দেয় না। এটি মূলত একটি copy বা snapshot নিয়ে কাজ করে, যার ফলে মূল Collection বা Map-এ কোনো পরিবর্তন হলেও iterator তার copy বা snapshot অনুযায়ী কাজ করে।

Key Characteristics of Fail-safe Iterators:

  • এটি ConcurrentModificationException ছুড়ে দেয় না। যখনই Collection বা Map পরিবর্তিত হয়, এটি তার একটি কপি বা snapshot ব্যবহার করে কাজ করে।
  • Fail-safe Iterators সাধারণত java.util.concurrent প্যাকেজের ক্লাসে (যেমন CopyOnWriteArrayList, CopyOnWriteArraySet) ব্যবহৃত হয়।
  • এটি thread-safe, অর্থাৎ একাধিক থ্রেড যদি একই সময় Collection পরিবর্তন ও ট্রাভার্স করে, তবে এটি কাজ করবে এবং কোন সমস্যা হবে না।

Example of Fail-safe Iterator:

import java.util.concurrent.CopyOnWriteArrayList;
import java.util.Iterator;

public class FailSafeIteratorExample {
    public static void main(String[] args) {
        CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Orange");

        // Creating an iterator
        Iterator<String> iterator = list.iterator();
        
        // Removing an element while iterating
        while (iterator.hasNext()) {
            String item = iterator.next();
            if (item.equals("Banana")) {
                list.remove(item); // This will not cause any exception
            }
        }

        // Printing the final list
        System.out.println("Final List: " + list);
    }
}

Output:

Final List: [Apple, Orange]

Explanation:

  • এখানে CopyOnWriteArrayList ব্যবহার করা হয়েছে, যা fail-safe iterator সরবরাহ করে। যখন আমরা Banana উপাদানটি মুছে ফেলেছি, এটি কোন ত্রুটি তৈরি করেনি। কারণ CopyOnWriteArrayList একটি snapshot তৈরি করেছে এবং iterator সেই কপির সাথে কাজ করেছে, মূল list এর পরিবর্তন ছাড়াই।

Comparison Between Fail-fast and Fail-safe Iterators

AspectFail-fast IteratorFail-safe Iterator
Exception on ModificationThrows ConcurrentModificationException when the collection is modified during iterationDoes not throw ConcurrentModificationException. Operates on a snapshot of the collection
Thread SafetyNot thread-safe (can cause issues in concurrent environments)Thread-safe (designed for concurrent environments)
PerformanceGenerally faster because it does not create copies of the collectionSlower because it operates on a copy or snapshot of the collection
Use CaseBest for single-threaded environments or when collection is not modified during iterationBest for multi-threaded environments or when concurrent modifications are required
ExamplesArrayList, HashMapCopyOnWriteArrayList, CopyOnWriteArraySet

  • Fail-fast Iterators: এগুলি সাধারণত Java Collections Framework এর ডিফল্ট iterator এবং এগুলি সাধারণত non-thread-safe থাকে। যখন Collection পরিবর্তিত হয় (যেমন, উপাদান যুক্ত করা বা মুছে ফেলা), তখন ConcurrentModificationException ছুড়ে দেয়।
  • Fail-safe Iterators: এগুলি thread-safe থাকে এবং Collection এর কপি বা snapshot ব্যবহার করে। এটি java.util.concurrent প্যাকেজের মধ্যে পাওয়া যায় এবং একাধিক থ্রেডের মধ্যে Collection পরিবর্তন করার সময় সেগুলির সাথে নিরাপদভাবে কাজ করতে সক্ষম।

যখন thread-safety এবং concurrent modification প্রয়োজন, তখন fail-safe iterator ব্যবহার করা উচিত। অন্যদিকে, যদি আপনি একক থ্রেডে কাজ করেন এবং আপনি চান যে কোনো পরিবর্তন হলে ত্রুটি ঘটুক, তাহলে fail-fast iterator ব্যবহার করতে পারেন।

Content added By
Promotion

Are you sure to start over?

Loading...